// https://soj.turingedu.cn/problem/61201/
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
using ll = long long;
using T = int;
T rad(); // quick read
const int inf = 0x3f3f3f3f;
#define rf(i, n) for (int i = 1; i <= (n); ++i)
const int max_size = 5 + 1e5;
const int maxn = 5 + 1e5;

int n;
int x_1[maxn], x_2[maxn], y_1[maxn], y_2[maxn];
pair<int, int> event[maxn << 1]; // 存储事件，frist 是事件的发生时间，second 是事件类型
int esiz;

/*
区间 +- 1
求 多少个点非 0
*/

int val[max_size << 2]; // 这一段有多少个非 0 点
int cov[max_size << 2]; // 这一段被完整覆盖了多少次
int tag[max_size << 2]; // 当前区间 +-1 的累计

void update_node(int u, int x) { //  整个区间都被覆盖
    cov[u] += x, tag[u] += x;
}

void push_down(int u) {
    if (tag[u] == 0) return;
    update_node(u << 1, tag[u]);
    update_node(u << 1 | 1, tag[u]);
    tag[u] = 0;
}

void maintain(int u, int l, int mid, int r) {
    cov[u] = min(cov[u << 1], cov[u << 1 | 1]);
    val[u] = (cov[u] == cov[u << 1] ? val[u << 1] : mid - l + 1) +
             (cov[u] == cov[u << 1 | 1] ? val[u << 1 | 1] : r - mid);
}

void update(int u, int l, int r, int s, int t, int x) {
    if (s <= l && r <= t) {
        update_node(u, x);
        return;
    }
    push_down(u);
    int mid = l + r >> 1;
    if (s <= mid) update(u << 1, l, mid, s, t, x);
    if (t > mid) update(u << 1 | 1, mid + 1, r, s, t, x);
    maintain(u, l, mid, r);
}

int ask() {
    return val[1];
}

int main() {
    n = rad();
    rf(i, n) {
        x_1[i] = rad(), y_1[i] = rad(), x_2[i] = rad(), y_2[i] = rad();
        event[esiz++] = {x_1[i], +i}; // 正数事件是插入 i
        event[esiz++] = {x_2[i], -i}; // 负数事件是删除 -i
    }
    sort(event, event + esiz);
    ll ans = 0, last = event[0].first;
    for (int j = 0; j < esiz; ++j) {
        // puts("g");
        ans += (event[j].first - last) * (ll)ask(), last = event[j].first; // 考虑一开始为 0
        if (event[j].second > 0) {
            int i = event[j].second;                            // 进入
            update(1, 1, max_size, y_1[i] + 1, y_2[i], +1); // 坐标转线段
        } else {
            int i = -event[j].second;                           // 删除
            update(1, 1, max_size, y_1[i] + 1, y_2[i], -1); // 坐标转线段
        }
    }
    printf("%lld", ans);
}

T rad() {
    T back = 0;
    int ch = 0, posi = 0;
    for (; ch < '0' || ch > '9'; ch = getchar())
        posi = ch ^ '-';
    for (; ch >= '0' && ch <= '9'; ch = getchar())
        back = (back << 1) + (back << 3) + (ch & 0xf);
    return posi ? back : -back;
}